#include "EventLoopThreadPool.h"

using  namespace tmms::network;

namespace
{
    void bind_cpu(std::thread &t,int n) //绑定cpu
    {
        cpu_set_t cpu;
        CPU_ZERO(&cpu);
        CPU_SET(n,&cpu);

        pthread_setaffinity_np(t.native_handle(),sizeof(cpu),&cpu);
    }
}
 
EventLoopThreadPool::EventLoopThreadPool(int thread_num,int start,int cpus) //定于的时候不能传实参
{//创建并初始化 thread_num 个线程​​，同时根据条件为每个线程绑定到指定的 CPU 核心。//新建一个线程就是新建一个EventLoopThread对象就行
    //调用这个线程池的构造函数的时候直接创建线程，并给线程绑定cpu
    if(thread_num <= 0)
    {
        thread_num = 1;
    }
    for (int i=0;i<thread_num;i++){
        threads_.emplace_back(std::make_shared<EventLoopThread>());
        if(cpus>0)
        {
            int n = (start+i) % cpus;
            bind_cpu(threads_.back()->Thread(),n); //为cpu绑定线程
        }
    }
}

EventLoopThreadPool::~EventLoopThreadPool()
{

}
            
std::vector<EventLoop *>  EventLoopThreadPool::GetLoops() const
{
    std::vector<EventLoop * > result;
    for(auto &t:threads_)
    {
        result.emplace_back(t->loop());
    }     
    return result;
}

EventLoop * EventLoopThreadPool::GetNextLoop()
{
    int index = loop_index_;
    loop_index_++;
    return threads_[index%threads_.size()]->loop();//循环地返回eventloop示例，一个线程只有一个EventLoop
}

size_t EventLoopThreadPool::Size()
{
    return threads_.size();
}

void EventLoopThreadPool::Start()
{
    for(auto &t:threads_)
    {
        t->Run();
    }
}
